const Redis = require('ioredis');
const config = require('../config');

// 创建客户端
const client = new Redis({
    host: config.redis.host,
    port: config.redis.port,
    password: config.redis.password,
    db: config.redis.db,
    retryStrategy: function (times) {
        const delay = Math.min(times * 100, 2000);
        return delay;
    },
    maxRetriesPerRequest: 1,
    enableOfflineQueue: false
});

// 错误处理
client.on('error', function (err) {
    console.log('Redis 连接错误:', err.message);
});

// 连接成功监听
client.on('ready', function () {
    console.log('Redis 连接就绪');
    // 连接就绪后进行一次 PING 测试
    client.ping().then(() => {
        console.log('Redis PING 测试成功');
    }).catch(err => {
        console.error('Redis PING 测试失败:', err.message);
    });
});

// 连接事件
client.on('connect', function () {
    console.log('Redis 已连接');
});

// 重连事件
client.on('reconnecting', function () {
    console.log('Redis 正在重新连接...');
});

// 存储值,默认有效期一年  
function redisSet(key, val, expire) {
    if (expire === undefined) expire = 31536000 * 5;
    return new Promise(function (resolve, reject) {
        try {
            if (typeof val === 'object') {
                val = JSON.stringify(val);
            }
            client.set(key, val, 'EX', expire, function (err) {
                if (err) {
                    console.error('Redis set error:', err);
                    return reject(err);
                }
                resolve(true);
            });
        } catch (err) {
            console.error('Redis set error:', err);
            reject(err);
        }
    });
}

// 读取值
function redisGet(key) {
    return new Promise(function (resolve, reject) {
        try {
            client.get(key, function (err, val) {
                if (err) {
                    console.error('Redis get error:', err);
                    return reject(err);
                }
                if (val == null) {
                    return resolve(null);
                }
                // 如果是json则转为对象，否则直接返回设置的值
                try {
                    resolve(JSON.parse(val));
                } catch (ex) {
                    resolve(val);
                }
            });
        } catch (err) {
            console.error('Redis get error:', err);
            reject(err);
        }
    });
}

// 删除值
function delKey(key) {
    return new Promise(function (resolve, reject) {
        try {
            client.del(key, function (err, result) {
                if (err) {
                    console.error('Redis del error:', err);
                    return reject(err);
                }
                resolve(result);
            });
        } catch (err) {
            console.error('Redis del error:', err);
            reject(err);
        }
    });
}

// 获取所有以特定前缀开头的键
function redisKeys(prefix) {
    return new Promise(function (resolve, reject) {
        client.keys(prefix, function (err, keys) {
            if (err) {
                console.error('Redis keys error:', err);
                return reject(err);
            }
            resolve(keys);
        });
    });
}

module.exports = {
    redisSet: redisSet,
    redisGet: redisGet,
    delKey: delKey,
    redisKeys: redisKeys,
    client: client // 导出客户端实例，以便其他模块可以使用其他 Redis 命令
};